/*
 * Copyright (C) 2017 Zhejiang BYCDAO Technology CO.,LTD.
 * All rights reserved.
 * Official Web Site: http://www.bycdao.com.
 * Developer Web Site: http://open.bycdao.com.
 */

package com.xiaoyung.easyisapisdk.common.base;

import java.io.Serializable;

import com.alibaba.fastjson2.JSON;
import com.fasterxml.jackson.annotation.JsonView;

//import io.swagger.annotations.ApiModelProperty;

/**
 * Rest泛型支持
 * @param <T> 返回的数据类型
 */
public class Rest<T> implements Serializable{
	private static final long serialVersionUID = 1L;

	@JsonView(GeneralViews.class)
	//@ApiModelProperty(value = "数据对象")
    private T data;
    
	@JsonView(GeneralViews.class)
    //@ApiModelProperty(value = "状态码")
    private Integer code;
    
	@JsonView(GeneralViews.class)
    //@ApiModelProperty(value = "返回消息")
    private String msg;

	/**
	 * 初始化一个新创建的 Rest 对象，使其表示一个空消息。
	 */
	public Rest() {
		
	}

	/**
	 * 初始化一个新创建的 Rest 对象
	 * 
	 * @param code 状态码
	 * @param msg  返回消息
	 */
	public Rest(int code, String msg) {
		this(code,msg,null);
	}

	/**
	 * 初始化一个新创建的 AjaxResult 对象
	 * 
	 * @param code 状态码
	 * @param msg  返回消息
	 * @param data 数据对象
	 */
	public Rest(int code, String msg, T data) {
		this.code = code;
		this.msg = msg;
		this.data = data;
	}
	
	public T getData() {
		return data;
	}

	public void setData(T data) {
		this.data = data;
	}

	public Integer getCode() {
		return code;
	}

	public void setCode(Integer code) {
		this.code = code;
	}

	public String getMsg() {
		return msg;
	}

	public void setMsg(String msg) {
		this.msg = msg;
	}

	/**
	 * 返回成功消息
	 * 
	 * @return 成功消息
	 */
	public static <R> Rest<R> success() {
		return new Rest<R>(HttpStatus.SUCCESS,"操作成功");
	}

	/**
	 * 返回成功数据
	 * 
	 * @return 成功消息
	 */
	public static <R> Rest<R> success(R data) {
		return new Rest<R>(HttpStatus.SUCCESS,"操作成功",data);
	}

	/**
	 * 返回成功消息
	 * 
	 * @param msg 返回消息
	 * @return 成功消息
	 */
	public static <R> Rest<R> success(String msg) {
		return new Rest<R>(HttpStatus.SUCCESS,msg,null);
	}

	/**
	 * 返回成功消息
	 * 
	 * @param msg  返回消息
	 * @param data 数据对象
	 * @return 成功消息
	 */
	public static <R> Rest<R> success(String msg, R data) {
		return new Rest<R>(HttpStatus.SUCCESS,msg,data);
	}

	/**
	 * 返回错误消息
	 * 
	 * @return
	 */
	public static <R> Rest<R> error() {
		return new Rest<R>(HttpStatus.ERROR,"操作失败",null);
	}

	/**
	 * 返回错误消息
	 * 
	 * @param msg 返回消息
	 * @return 警告消息
	 */
	public static <R> Rest<R> error(String msg) {
		return new Rest<R>(HttpStatus.ERROR,msg,null);
	}

	/**
	 * 返回错误消息
	 * 
	 * @param msg  返回消息
	 * @param data 数据对象
	 * @return 警告消息
	 */
	public static <R> Rest<R> error(String msg, R data) {
		return new Rest<R>(HttpStatus.ERROR,msg,data);
	}

	/**
	 * 返回错误消息
	 * 
	 * @param code 状态码
	 * @param msg  返回消息
	 * @return 警告消息
	 */
	public static <R> Rest<R> error(int code, String msg) {
		return new Rest<R>(code,msg,null);
	}
	
	public String toString() {
		return this==null?null:JSON.toJSONString(this);
	}
}
